//路由鉴权，某一个路由什么条件下可以访问，什么条件下不能访问。
import router from '@/router'
// pnpm i nprogress
//@ts-ignore
import nprogress from 'nprogress'
import "nprogress/nprogress.css"
nprogress.configure({ showSpinner: false });//把右上的加载小球干掉
import pinia from './store'
// 获取用户相关的小仓库里的token，判断是否登录
import  useUserStore from './store/modules/user'
import setting from './setting';
// 在组件外部，拿不到仓库的数据通过以下方法  须得引入大仓库才可以
let userStore = useUserStore(pinia)
console.log(userStore);

// 全局守卫：项目当中任意路由切换都会触发的钩子
// 全局前置路由
router.beforeEach(async(to: any, _from: any, next: any)=>{
  document.title = `${setting.title}-${to.meta.title}`
  nprogress.start();
  // 获取token
  let token = userStore.token
  //获取用户名
  let username = userStore.username
  if(token){
    // 登录成功后，要做到不能再访问login页面了（指向首页），其余路由可以访问
    if(to.path=='/login'){
      next({path:'/'})
    }else{
      // 其余路由可以访问
      // 有用户信息，才能访问菜单中的各个项目（路由）
      // 路由跳转时，守卫判断是否有用户信息，有===>放行。没有===>发请求得到再放行。
     if(username){
      next();
     }else{
      // 发请求 
        // 调用这个方法，返回一个promise，成功或失败，取决于返回的结果
        try {
          await userStore.userInfo();
            //万一:刷新的时候是异步路由,有可能获取到用户信息、异步路由还没有加载完毕,出现空白的效果
            next({ ...to })

        } catch (error) {
          // 登录成功，发请求，但没有拿到=====>token过期=====>清空用户相关的数据，指向login
          //2.用户手动修改了本地存储的token
          //退出登录
         await userStore.userLogout();
          next({path:'/login',query:{redirect:to.path}})
        }
     }
    }
  }else{
    // 没登录，只能访问login，不能往首页,数据大屏等跳，其他6个不能访问（去login)
    if(to.path == '/login'){
      next();
    }else{
      next({path:'/login',query:{redirect:to.path}})
    }
  }
})
// 全局后置路由
router.afterEach((_to: any, _from: any, _next: any)=>{
  nprogress.done();
});


// 没登录，只能访问login，不能往首页,数据大屏等跳，其他6个不能访问（执行login)

// 登录成功后，要做到不能再访问login页面了（指向首页），其余路由可以访问

//是否登录，根据token判断
